package gitee_hook

import (
	"strconv"

	"jihulab.com/linksaas/proto-gen-go/events/events_gitee"
)

type PushHook struct {
	HookId             int32       `json:"hook_id"`               // 钩子 id。
	HookUrl            string      `json:"hook_url"`              // 钩子路由。
	HookName           string      `json:"hook_name"`             // 钩子名，固定为 push_hooks/tag_push_hooks。
	Password           string      `json:"password"`              // 钩子密码。eg：123456
	Timestamp          string      `json:"timestamp"`             // 触发钩子的时间戳。eg: 1576754827988
	Sign               string      `json:"sign"`                  // 钩子根据密钥计算的签名。eg: "rLEHLuZRIQHuTPeXMib9Czoq9dVXO4TsQcmQQHtjXHA="
	Ref                string      `json:"ref"`                   // 推送的分支。eg：refs/heads/master
	Before             string      `json:"before"`                // 推送前分支的 commit id。eg：5221c062df39e9e477ab015df22890b7bf13fbbd
	After              string      `json:"after"`                 // 推送后分支的 commit id。eg：1cdcd819599cbb4099289dbbec762452f006cb40
	TotalCommitsCount  int32       `json:"total_commits_count"`   // 推送包含的 commit 总数。
	CommitsMoreThanTen bool        `json:"commits_more_than_ten"` // 推送包含的 commit 总数是否大于十二。
	Created            bool        `json:"created"`               // 推送的是否是新分支。
	Deleted            bool        `json:"deleted"`               // 推送的是否是删除分支。
	Compare            string      `json:"compare"`               // 推送的 commit 差异 url。eg：https://gitee.com/oschina/git-osc/compare/5221c062df39e9e477ab015df22890b7bf13fbbd...1cdcd819599cbb4099289dbbec762452f006cb40
	Commits            []Commit    `json:"commits"`               // 推送的全部 commit 信息。
	HeadCommit         Commit      `json:"head_commit"`           // 推送最前面的 commit 信息。
	Repository         *Project    `json:"repository"`            // 推送的目标仓库信息。
	Project            *Project    `json:"project"`               // 推送的目标仓库信息。
	UserId             int32       `json:"user_id"`               // 用户Id
	UserName           string      `json:"user_name"`             // 推送者的昵称。
	User               *User       `json:"user"`                  // 推送者的用户信息。
	Pusher             *User       `json:"pusher"`                // 推送者的用户信息。
	Sender             *User       `json:"sender"`                // 推送者的用户信息。
	Enterprise         *Enterprise `json:"enterprise"`            // 推送的目标仓库所在的企业信息。
}

func (item *PushHook) ToProtoBuf() *events_gitee.PushEvent {
	ret := &events_gitee.PushEvent{
		HookId:             item.HookId,
		HookUrl:            item.HookUrl,
		HookName:           item.HookName,
		Sign:               item.Sign,
		Ref:                item.Ref,
		Before:             item.Before,
		After:              item.After,
		TotalCommitsCount:  item.TotalCommitsCount,
		CommitsMoreThanTen: item.CommitsMoreThanTen,
		Created:            item.Created,
		Deleted:            item.Deleted,
		Compare:            item.Compare,
		Commits:            []*events_gitee.Commit{},
		HeadCommit:         item.HeadCommit.ToProtoBuf(),
		Project:            []*events_gitee.Project{},
		UserId:             item.UserId,
		UserName:           item.UserName,
		User:               []*events_gitee.User{},
		Pusher:             []*events_gitee.User{},
		Sender:             []*events_gitee.User{},
		Enterprise:         []*events_gitee.Enterprise{},
	}
	if item.Commits != nil {
		for _, commit := range item.Commits {
			ret.Commits = append(ret.Commits, commit.ToProtoBuf())
		}
	}
	if item.Project != nil {
		ret.Project = append(ret.Project, item.Project.ToProtoBuf())
	}
	if item.User != nil {
		ret.User = append(ret.User, item.User.ToProtoBuf())
	}
	if item.Pusher != nil {
		ret.Pusher = append(ret.Pusher, item.Pusher.ToProtoBuf())
	}
	if item.Sender != nil {
		ret.Sender = append(ret.Sender, item.Sender.ToProtoBuf())
	}
	if item.Enterprise != nil {
		ret.Enterprise = append(ret.Enterprise, item.Enterprise.ToProtoBuf())
	}
	ret.Timestamp, _ = strconv.ParseInt(item.Timestamp, 10, 64)
	return ret
}
